import sys,os
import configparser
import datetime

import numpy as np
import pandas as pd
pd.set_option("display.max_columns",1000)
pd.set_option("display.width",1000)
pd.set_option("display.max_colwidth",1000)
运行目录=os.path.dirname(os.path.realpath(sys.argv[0]))
副本目录=os.path.join(运行目录,"临时文件")
for filename in os.listdir(运行目录):
    if filename.startswith("订单") :
        订单文件名称=filename
        订单原始数据目录=os.path.join(运行目录,filename)
邮编分区表目录=os.path.join(运行目录,"邮编分区表.xlsx")
邮编分区表= pd.read_excel(邮编分区表目录, sheet_name=None)

# 读取配置文件
cfg_file = os.path.join(运行目录, 'config.ini')  # 运行目录下的配置文件
cfg = configparser.ConfigParser()
cfg.read(cfg_file, encoding="utf-8")  # 读取config.ini
zonefig=cfg.get("para","zone")
zonefig = {i.split(":")[0]: i.split(":")[1] for i in zonefig.split(";")}
zonefigs = {}
for j, k in zonefig.items():
    zonefigs.update({j: []})
    if len(k.split(","))==1:
        zonefigs[j].append(int(k.split(",")[0]))
    else:
        for i in range(int(k.split(",")[0]),int(k.split(",")[1])+1):
            zonefigs[j].append(i)
邮编分区表= 邮编分区表["邮编分区"].drop(0)
邮编分区表 = 邮编分区表.fillna(0)
def 判断哪个区(分区数据,区号配置,邮政编码):
    对应分区="Zone"
    列位置=0
    值=""
    邮政编码=邮政编码.zfill(5)   #向左补齐0
    for index, row in 分区数据.iterrows():
        for col in 分区数据.columns:
            值=str(int(row[col])).zfill(3)
            if 值 == 邮政编码[0:3]:
                列位置 = 分区数据.columns.get_loc(col)+1
                break
    for i,j in 区号配置.items():
        if 列位置 in j:
            对应分区=对应分区+i
            # print(f"{邮政编码}对应为：{对应分区}")
            return 对应分区.upper()
            break

def 计算快递费区间(重量oz):
    oz倍数=int(重量oz/1)+1

    if oz倍数 <= 16:
        return str(oz倍数)+"oz"
    else:
        lb倍数=int(重量oz*0.0625)+1
        return str(lb倍数) + "LB"


# 创建邮政编码的分区信息
分区费用表目录=os.path.join(运行目录,"分区费用表.xlsx")
分区费用=pd.read_excel(分区费用表目录)
订单原始数据=pd.read_excel(订单原始数据目录)
订单原始数据 = 订单原始数据.loc[:, ["订单号","外部订单号","数量","包裹重量(kg)","收货人邮编"]]
#新增序号字段
订单原始数据 = 订单原始数据.reset_index(drop=True).reset_index()
订单原始数据.columns = ['序号',"订单号","外部订单号","数量","包裹重量(kg)","收货人邮编"]
订单原始数据['序号'] += 1


#计算出库费
订单原始数据["出库费"]=0
#计算分区
订单原始数据["分区"]=""
# 订单原始数据["收货人邮编"]= 订单原始数据["收货人邮编"].fillna(method='ffill')
# 快递费用["序号"]= 快递费用["序号"].fillna(0)
#计算重量OZ
# 快递费用["包裹重量(kg)"]= 快递费用["包裹重量(kg)"].fillna(method='ffill')
订单原始数据["重量OZ"]=(订单原始数据["包裹重量(kg)"]*35.27)
订单原始数据["重量BL"]=(订单原始数据["包裹重量(kg)"]*2.2)
上个订单编号=""
for index, row in 订单原始数据.iterrows():
    # 计算出库费
    重量kg=row["包裹重量(kg)"]
    订单原始数据.loc[index, '出库费'] =0.5 if 重量kg <=1 else 0.6 if 1<重量kg <=2 else 0.9 if  2 < 重量kg <=5  else 1.3 if  5 < 重量kg <=10 else 2.5 if 10 < 重量kg <=20 else 5 if 20 < 重量kg <=31 else 0.3 * 重量kg
    订单原始数据.loc[index, '出库费']=订单原始数据.loc[index, '出库费']*订单原始数据.loc[index, '数量']
    #计算分区
    分区信息=判断哪个区(邮编分区表, zonefigs, str(row["收货人邮编"]))
    订单原始数据.loc[index, '分区']=分区信息

    #计算快递费
    # print(row["重量OZ"])
    # print(分区信息)
    快递费档位=计算快递费区间(row["重量OZ"])
    # print(row["重量OZ"],快递费档位)
    # print(row["分区"],快递费档位)
    # print(分区费用[分区费用["Rate Category"]==快递费档位][分区信息].iloc[-1])
    当前订单编号=str(row["订单号"])
    try:
        if 当前订单编号!=上个订单编号:
            订单原始数据.loc[index,"快递费"]=分区费用[分区费用["Rate Category"]==快递费档位][分区信息].iloc[-1].round(2)
        else:
            订单原始数据.loc[index, "快递费"]=0
    except:
        print(f"第{index+1}行有问题快递费计算失败")
    上个订单编号=当前订单编号
    # 快递费用["重量BL"]=
NOW=datetime.datetime.now()
费用结果文件="【费用结果】_"+订单文件名称.split(".")[0]+"_"+NOW.strftime('%Y%m%d%H%M%S')+".csv"
保存目录=os.path.join(运行目录,费用结果文件)
订单原始数据.to_csv(保存目录,index=False)
print("快递费用已生成")
input("按任意键退出")